Skip to main content

Exemple CNC 10 : Programmation de trajectoires CNC dynamiques

Voir le CNC10_DynamicPath.project exemple de projet dans le répertoire d'installation de CODESYS en dessous de ..\CODESYS SoftMotion\Examples.

Cet exemple montre comment un chemin CNC peut être créé directement dans l'application au moment de l'exécution - sans être alimenté avec du code G à partir d'un objet de programme CNC ou d'un fichier. Lorsque ce type de programme CNC conventionnel est compilé, les données de chemin sont stockées dans un SMC_CNC_Data type de structure de données. Ces données internes sont ensuite compilées dans des structures de données globales spécifiques selon le mode de compilation (SMC_CNC_REF ou SMC_OutQueue).

En mode compilation SMC_CNC_REF, les données sont stockées dans un tableau de SMC_GEOINFO éléments. Le tableau dans le code de l'application est généralement transmis à l'instance du bloc fonction SMC_NCDecoder. A l'exécution, les données y sont décodées et stockées dans une structure de données globale de type SMC_OUTQUEUE. Ensuite, les blocs fonctionnels de prétraitement de chemin peuvent être appelés.

En mode compilation SMC_OutQueue, une structure de données globale (SMC_OUTQUEUE) est généré directement. Cette structure de données dans le code de l'application est transmise à l'interpolateur (SMC_Interpolator instance FB). Le bloc fonction SMC_NCDecoder ne s'appelle pas.

En mode compilation DÉPOSER, les données sont stockées dans un fichier. Les données sont stockées sous la forme d'un tableau d'éléments de type SMC_GEOINFO et correspondent aux données générées en mode compilation SMC_CNC_REF.

Au lieu de programmer le chemin CNC, vous pouvez programmer un code d'application qui instancie une structure de données de type SMC_OUTQUEUE au moment de l'exécution et attribue ses valeurs. Vous programmez une trajectoire CNC qui est générée dynamiquement lors de l'exécution. Vous pouvez transmettre la structure de données à d'autres instances de blocs fonctionnels (par exemple aux blocs fonctionnels de prétraitement de chemin ou au bloc fonctionnel SMC_Interpolator).

La programmation

Astuce

le CNCDynamicPath exemple de projet se trouve dans le répertoire d'installation de CODESYS. L'exemple de projet a été élaboré à partir du CNConline projet. Il comprend le Path programme au lieu de la programmation graphique Example chemin. Une structure de données de type SMC_OUTQUEUE est généré dynamiquement.

. Déclaration:
  • Déclarer une structure de données de type SMC_OUTQUEUE. La structure de données contient les données de trajectoire CNC et est renseignée dynamiquement.

    Exemple: QUEUE

  • Allouez de la mémoire pour le chemin avec la quantité requise pour SMC_GEOINFO éléments.

    Exemple: BUF

  • Déclarer une variable de type SMC_GEOINFO avec une première étape.

    Exemple: GEO

. Mise en œuvre:
  • Un élément de tableau de type de données SMC_GEOINFO correspond à un élément de chemin dans le code CNC. Les étapes suivantes doivent être effectuées pour chaque élément afin d'ajouter l'élément au SMC_OUTQUEUE:

  • Chaque élément de tableau a une position de début qui correspond à la position de fin de l'élément de tableau précédent.

    Exemple: GEO.piStartPos.dX := 0; ou GEO.piStartPos := GEO.piDestPos;

  • Déterminez un type de mouvement pour chaque élément du tableau.

    Exemple: GEO.iMoveType := CCLW; ou GEO.iMoveType := LIN;

  • Définissez les paramètres du type de mouvement. Ceci n'est pas obligatoire pour tous les types de mouvement.

    Exemple : Pour un arc (type de mouvement : CCLW), le réglage des positions suivantes est requis : geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;

  • Insérez le calcul de la position finale.

    SMC_CalcEndPnt(ADR(GEO));

  • Insérez le calcul de la longueur de l'objet.

    SMC_CalcLengthGeo(ADR(GEO));

  • Enregistrez l'objet dans QUEUE:

    SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));

Lorsque le chemin est entièrement créé, les marqueurs de fin doivent être définis : QUEUE.bEndOfList := TRUE;

Astuce

Ensuite, lorsqu'un bloc fonction de prétraitement de chemin est appelé, il est nécessaire de définir le bit de début ou de fin pour InternMark.

Exemple 50. Exemple

Chemin CNC avec deux éléments de chemin

Dans cet exemple, les tableaux ne sont pas définis avec les positions X/Y. S'il s'agissait d'un exemple avec deux éléments de chemin comme décrit, alors ces tableaux devraient avoir deux éléments chacun.

Par exemple, dérivé de l'exemple de projet :

xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
        iState : INT;
        QUEUE : SMC_OUTQUEUE;
        BUF : ARRAY[0..49] OF SMC_GEOINFO;
                // Memory allocation
        GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
                // Initial path element
        n : INT := 0;
        QUEUE.nSize := SIZEOF(BUF);
END_VAR

CASE iState OF
0:
        QUEUE.pbyBuffer := ADR(BUF[0]);
                // Initialize QUEUE
        SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
        iState := iState + 1;

1:
        // Fill QUEUE
        WHILE NOT QUEUE.bFull DO
                // When QUEUE is full, wait until it has been processed by the following FBs
                n := n + 1;
                GEO.iSourceLine_No := n;
                GEO.piStartPos := GEO.piDestPos;
                        // Copying last destination
                GEO.iMoveType := LIN;
                        // Generating linear movement
                GEO.iObjNo := GEO.iObjNo + 1;
                        // Calculating number
                GEO.piDestPos.dX := xp[n];
                        // Generatint position
                GEO.piDestPos.dY := yp[n];
                SMC_CalcLengthGeo(pg := ADR(GEO));
                        // Calculating length of object with the help of the standard function
                SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
                        // Appending object to QUEUE
                IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
                        // All target positions processed
                        QUEUE.bEndOfList := TRUE;
                        n := 0;
                        iState := 2;
                        EXIT;
                END_IF
        END_WHILE

2:
        //Done
        ;
END_CASE

CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing


Important

Si la SMC_OUTQUEUE la structure de données est remplie avec SMC_GEOINFO data et l'élément de structure de données a été défini sur bFULL = TRUE, alors nous ne recommandons pas une autre affectation de SMC_GEOINFO Les données. Dans ce cas, la création du chemin est interrompue à l'exécution jusqu'à ce que le premier élément du SMC_OUTQUEUE la structure des données est traitée dans l'interpolateur. Ce n'est qu'alors qu'un autre élément est inséré.

Évitez cette interruption en allouant suffisamment de mémoire. Voir variable BUF.

Important

Si la structure de données SMC_OUTQUEUE est rechargé après la première exécution, puis l'interpolateur et tous les blocs fonction de prétraitement (exemple : SMC_CheckVelocities) doivent être redémarrés par un front montant à Execute.